template.tsx 1.0 KB

123456789101112131415161718192021222324252627282930313233343536
  1. "use client";
  2. import { usePathname } from "@/i18n/routing";
  3. import { AnimatePresence, motion } from "framer-motion";
  4. import { ReactNode, useEffect } from "react";
  5. const routerStack = new Map();
  6. const Template = ({ children }: { children: ReactNode }) => {
  7. const key = usePathname();
  8. useEffect(() => {
  9. if (routerStack.has(key)) {
  10. routerStack.delete(key);
  11. } else {
  12. routerStack.set(key, key);
  13. }
  14. }, [key]);
  15. const isEnter = routerStack.has(key);
  16. return (
  17. <AnimatePresence mode="popLayout">
  18. <motion.div
  19. layout
  20. key={key}
  21. initial={{ x: routerStack.has(key) ? 750 : -750, opacity: 0 }}
  22. animate={{ x: 0, opacity: 1 }}
  23. exit={{ x: routerStack.has(key) ? -750 : 750, opacity: 0 }}
  24. transition={{ duration: 0.3 }}
  25. className={"h-[100%]"}
  26. >
  27. {children}
  28. </motion.div>
  29. </AnimatePresence>
  30. );
  31. };
  32. export default Template;